-
无回退扫描: 除非遇到宏展开, 否则扫描过程不会回退.
-
遇到宏展开时的扫描顺序: 先展开参数, 再展开宏(进行 $ 的匹配), 最后对展开内容重新扫描
-
参数展开过程: 先忽略领头非引用空白, 再分析参数, 直到遇到非引用',', 以完成对一个参数的展开. 这里, 分析参数的过程可能产生',', 这里的','同样会终止该参数的展开.
-
嵌套'(' : 参数表中可以有非引用的'('和')', 但必须匹配.
-
参数个数: 参数个数不足时以空串补全, 多余的参数忽略不计. 注意, 没有()的宏表示无参数, 有一个空()的宏表示有一个空字符串参数.
-
宏辨认: 依扫描顺序, 以首个非字母及下划线字符为起始分割符, 以空白和'(' ')'为终止分割符, 对带参数的宏, 宏名与 '('间不能有空白. 另外, 引用的起点, 终止以及宏展开后重新扫描的起点也将作为宏辨认的分割符.
-
注释#: 等价于 # 到 \n 间的内容被 quote (但展开后不删除 # 及 \n)
-
宏展开与引号展开(含#展开)的区别: 宏展开后会重新扫描, 引号展开后不会重新扫描.
-
引号 与 #: 遇到后立即进入引用环境, 在引用环境中的 ' 和 # 均看成普通字符通过扫描.
-
dnl: 忽略该关键字及本行内以后的全部内容(含 \n)
-
宏的辨认时机: 宏的辨认发生在遇到'('时, 因为在分析扫描调用宏的参数过程中可能更改宏自身的定义.
-
define 特殊符号:
-
'$1': 第1个参数;
-
'$*': 全部参数;
-
'$@': 全部参数, 每个参数两侧加一对引号;
-
'$0': 宏名称;
-
'$#': 实际参数个数.
-
define 语法:
define(name, [expansion])